/*
 * @Author: shiyue 2647472992@qq.com
 * @Date: 2024-08-26 20:22:10
 * @LastEditors: shiyue 2647472992@qq.com
 * @LastEditTime: 2024-08-26 20:46:23
 * @FilePath: \SelectSort\SelectSort.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;


class SelectSort // 更准确的命名可能是HybridSort或类似的名字
{
public:
    // 构造函数，接收一个整数向量的引用，并初始化内部数组和大小
    SelectSort(vector<int>& array)
    :_array(array) // 使用初始化列表直接初始化_array
    ,_size(array.size()) // 初始化数组大小
    ,_capacity(array.size()) // 初始化容量，但在这个类中容量并未被使用
    {}

    // 析构函数，当前为空，因为类中没有分配动态内存
    ~SelectSort()
    {}

    // 打印数组的函数
    void PrintArray()
    {
        int n = _size; // 使用_size变量，但直接使用_array.size()可能更清晰
        for (int i = 0; i < n; ++i)
        {
            cout << _array[i] << " "; // 打印数组元素
        }
        cout << endl; // 打印换行符
    }

    // 排序函数，但实现的是选择排序和堆排序的混合算法
    void Sort()
    {
        int left = 0, right = _size - 1; // 初始化左右指针
        while (left < right) // 当左指针小于右指针时继续循环
        {
            int max = left, min = left; // 初始化最大值和最小值的索引为左指针
            for (int i = left; i <= right; ++i) // 遍历数组
            {
                if (_array[min] > _array[i]) // 找到更小的值
                {
                    min = i; // 更新最小值的索引
                }

                if (_array[max] < _array[i]) // 找到更大的值
                {
                    max = i; // 更新最大值的索引
                }
            }
            swap(_array[left], _array[min]); // 将最小值交换到左指针位置
            if (max == left) // 如果最大值索引和左指针相同，则最大值已被移动到左端，需要更新max索引
            {
                max = min; 
            }
            swap(_array[right], _array[max]); // 将最大值交换到右指针位置
            ++left; // 左指针右移
            --right; // 右指针左移
        } 

       
    }
private:
    vector<int> _array; // 内部存储的数组
    int _size; // 数组的大小
    int _capacity; // 未使用的容量变量，可以移除
};

int main()
{
    vector<int> array(10, 8); // 初始化一个大小为10的整数向量，所有元素初始值为8
    srand(time(nullptr)); // 设置随机数种子
    for (auto &e : array) // 遍历数组，为每个元素赋一个0到99之间的随机数
    {
        e = rand() % 100;
    }
    SelectSort test(array); // 创建SelectSort对象，传入数组
    test.PrintArray(); // 打印排序前的数组
    test.Sort(); // 调用排序函数
    test.PrintArray(); // 打印排序后的数组

    return 0;
}
